package tedu.spring.eg1;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 控制反转（Inversion of Control, IoC）是一种软件设计原则，其核心思想在于改变传统程序设计中组件之间控制权的分配方式。
 * 在没有应用IoC的设计中，组件通常主动创建它所依赖的其他组件，这就导致了组件之间的紧密耦合，使得系统难以维护和扩展。
 * IoC的思想可以通俗理解为：原本由组件自己控制并直接创建依赖对象的权力被“反转”给了外部容器（如Spring框架的IoC容器）。
 * 容器负责创建对象、管理对象的生命周期以及对象之间的依赖关系，并在适当的时候将这些依赖关系注入到需要它们的组件中。
 * 这样，组件不再负责定位依赖，而是被动接收（即依赖被注入）所需的服务。
 * 通过应用IoC，可以获得以下好处：
 * 降低耦合：因为依赖关系由容器管理，组件之间不必直接相互了解，这减少了代码间的直接依赖，使得系统更易于修改和扩展。
 * 可测试性增强：依赖关系的外部化使得在测试时可以轻松替换掉真实的依赖，用模拟对象（Mock Objects）进行单元测试。
 * 灵活性和可配置性提升：系统的行为可以在不修改代码的情况下，通过改变配置来调整，比如更换不同的服务实现。
 * 生命周期管理：容器可以统一管理Bean的创建、初始化、销毁等生命周期事件，使得资源管理和释放更加高效和自动化。
 * 实现IoC的主要方式有两种：
 * 依赖注入（Dependency Injection, DI）：直接将依赖对象注入到需要它们的组件中，这是最常用的实现方式。
 * 依赖查找（Dependency Lookup）：组件在需要时主动向容器查询依赖对象，这种方式不如依赖注入常用，因为它要求组件
 * 了解容器的API。
 * 总的来说，控制反转是一种促进松耦合、提高软件模块复用性和可维护性的设计哲学。
 */
public class TestProduct {
    public static void main(String[] args) {
//        ApplicationContext context = new AnnotationConfigApplicationContext("tedu.spring.eg1");
//        Product product = context.getBean(Product.class);
//        System.out.println(product);
        BeanFactory factory = new AnnotationConfigApplicationContext("tedu.spring.eg1");
        Product factoryBean = factory.getBean(Product.class);
        System.out.println(factoryBean);
    }
}
